#include "serveur.h"
#include "ui_serveur.h"

Serveur::Serveur(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Serveur)
{
    ui->setupUi(this);
    serveur = new QTcpServer(this);
    serveur->setMaxPendingConnections(6);
    if (!serveur->listen(QHostAddress("127.0.0.1"), 33555)) // Démarrage du serveur sur toutes les IP disponibles et sur le port 33555
        ui->etatServeur->setText(QString::fromUtf8("Le serveur n'a pas pu être démarré. Raison :<br />") + serveur->errorString());
    else
    {
        QString ad = QNetworkInterface::allAddresses().at(2).toString();
        ui->etatServeur->setText(QString::fromUtf8("Le serveur a été démarré sur le port <strong>") + QString::number(serveur->serverPort()) + tr("</strong>.<br />Des clients peuvent maintenant se connecter sur l'adresse : <strong>") + ad + tr("</stong>"));
        connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
    }

    tailleMessage = 0;
}

Serveur::~Serveur()
{
    delete ui;
}

void Serveur::nouvelleConnexion()
{         
    if(clients.size() < 2)
    {
        QTcpSocket *nouveauClient = serveur->nextPendingConnection();
        clients << nouveauClient;

        connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
        connect(nouveauClient, SIGNAL(disconnected()), this, SLOT(deconnexionClient()));
    }else
    {
        QTcpSocket *nouveauClient = serveur->nextPendingConnection();
        QString message = QString::fromUtf8("Nombre de joueurs max atteint!");
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);

        out << (quint16) 0;
        out << message;
        out.device()->seek(0);
        out << (quint16) (paquet.size() - sizeof(quint16));

        if(nouveauClient->write(paquet) == -1)
        {
            ui->Info->append("Erreur envoi: " + message);
        }
        ui->Info->append("Envoye : " + message);
    }

}

void Serveur::deconnexionClient()
{
    //envoyerATous(tr("<em>Un client vient de se déconnecter</em>"));
    QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
    if (socket == 0)
        return;
    clients.removeOne(socket);
    socket->deleteLater();

}

void Serveur::donneesRecues()
{
    ui->Info->append(QString::fromUtf8("Nouvelles données"));
    QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
    if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
        return;

    QDataStream in(socket);
    if (tailleMessage == 0)
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
             return;
        in >> tailleMessage;
    }
    if (socket->bytesAvailable() < tailleMessage)
        return;
    QString message;
    in >> message;
    ui->Info->append(QString::fromUtf8("Recu: ") + message);

    if(message[0] == '&')
    {
        m_client.append(message.mid(1,message.size() -2));
        for(int i = 0; i < m_client.size(); ++i)
            envoyerATous(tr("&") + m_client.value(i) + tr("&"));
    }else if(message[0] == '#')
    {
        m_client.remove(m_client.indexOf(message.mid(1,message.size()-2)));
        envoyerATous(message);
    }else
        envoyerATous(message);

    tailleMessage = 0;
    if (socket->bytesAvailable() > 0)
         donneesRecues();
    socket->flush();
}
void Serveur::envoyerATous(const QString &message)
{
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    out << (quint16) 0;
    out << message;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));
    for (int i = 0; i < clients.size(); i++)
    {
        if(clients[i]->write(paquet) == -1)
        {
            ui->Info->append("Erreur envoi: " + message);
        }
        ui->Info->append("Envoye : " + message);
    }

}

void Serveur::on_boutonQuitter_clicked()
{
    exit(1);
}
